﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Security;
using System.Data.SqlClient;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using extremeEvents.Data;

namespace extremeEvents
{
    class DLGenerica
    {

        private static DLGenerica instance = new DLGenerica();
        private DLGenerica() { }

        public Utilizador utilizador;
        

        public static DLGenerica Instance
        {
            get
            {
                return instance;
            }
        }

        /// <summary>
        /// Função utilizada para autenticar o utilizador
        /// </summary>
        /// <param name="username">O UserName a ser testado</param>
        /// <param name="password">A password a ser testado</param>
        /// <returns>True, se a autenticação estiver correcta</returns>
        public Boolean verificaAutenticação(string username, string password)
        {

            if (Membership.ValidateUser(username, password))
            {
                //obter utilizador da BD
                MembershipUser user = Membership.GetUser(username);
                //obter entity
                using (var utilizadorDB = new extremeEventsEntities())
                {
                    //obter dados do utilizador
                    utilizador utilizadorDados = utilizadorDB.utilizador.Where("it.id_utilizador = GUID'" + user.ProviderUserKey + "'").First();
                    
                    //definir objecto local Utilizador
                    this.utilizador = new Utilizador
                    {
                        UserId = (Guid)user.ProviderUserKey,
                        UserName = user.UserName,
                        Nome = utilizadorDados.primeiro_nome + " " + utilizadorDados.ultimo_nome
                    };
                }

                return true;
            }

            //verificar credencias
            return false;
        }


        /// <summary>
        /// Função utilizada para alterar o estado de um utilizador
        /// </summary>
        /// <param name="id">O id do utilizado</param>
        /// <param name="estado">O estado a definir (0->Inactivo, 1->Activo)</param>
        /// <returns></returns>
        public bool alterarEstadoUtilizador(Guid id, bool estado) {

            try
            {

                using (var utilizadorDB = new extremeEventsEntities())
                {
                    //alterar o estado na BD
                    var rst = utilizadorDB.alterarEstadoUtilizador(id, estado);

                    return true;
                }

            }
            catch (Exception e) {
                Console.WriteLine(e);
                return false;
            }

        }

        /// <summary>
        /// Obter os dados de um utilizador baseado no seu Guid
        /// </summary>
        /// <param name="id">O id do utilizador</param>
        public ComplexObject getUtilizadorById(Guid id)
        {
            using (var utilizadorDB = new extremeEventsEntities())
            {
                //procurar e retornar utilizador
                return utilizadorDB.procurarUtilizador_porGuid(id).ToList()[0];
            }
        }

        /// <summary>
        /// Obter os eventos
        /// </summary>
        public List<listarEventos_Result> listarEventos()
        {
            using (var utilizadorDb = new extremeEventsEntities())
            {
                //retorna os eventos para listar
                return utilizadorDb.listarEventos().ToList();
            }
        }
        /// <summary>
        /// Função utilizada para alterar os dados de um evento
        /// </summary>
        /// <param name="id">O id do evento</param>
        /// <param name="id_categoia">O id da categoria</param>
        /// <returns>bool</returns>
        public bool editarEvento(int id, int id_categoria, DateTime data_inicio, DateTime data_fim, string titulo,
                                string descricao, decimal preco, string morada, string codigo_postal, string url, string tlf,
                                string email, string latitude, string longitude)
        {
            try
            {
                using (var utilizadorDb = new extremeEventsEntities())
                {
                    //altera os dados do evento
                    utilizadorDb.editEvento(id, id_categoria, data_inicio, data_fim, titulo, descricao, preco, morada, codigo_postal, url,
                                            tlf, email, latitude, longitude);
                    return true;
                }
            } 
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
       
        }
        /// <summary>
        /// Obter os dados de um evento com flyer baseado no seu id
        /// </summary>
        /// <param name="id">O id do evento</param>
        public ComplexObject getEventoComFlyerById(int id)
        {
            using (var utilizadorDB = new extremeEventsEntities())
            {
                //procurar e retornar evento
                return utilizadorDB.procurarEventoComFlyer_porID(id).ToList()[0];
            }
        }

        /// <summary>
        /// Obter os dados de um evento sem flyer baseado no seu id
        /// </summary>
        /// <param name="id">O id do evento</param>
        public ComplexObject getEventoSemFlyerById(int id)
        {
            using (var utilizadorDB = new extremeEventsEntities())
            {
                //procurar e retornar evento
                return utilizadorDB.procurarEventoSemFlyer_porID(id).ToList()[0];
            }
        }

        /// <summary>
        /// Obter os dados dum flyer com bse no id do evento
        /// </summary>
        /// <param name="id">O id do evento</param>
        public ComplexObject getFlyerByIdEvento(int id)
        {
            using (var utilizadorDB = new extremeEventsEntities())
            {
                //procurar e retornar flyer
                List<procurarFlyer_porIdEvento_Result> l = utilizadorDB.procurarFlyer_porIdEvento(id).ToList();
                if (l.Count > 0) return utilizadorDB.procurarFlyer_porIdEvento(id).ToList()[0];
                else return null;
            }
        }

        /// <summary>
        /// Obter as categorias
        /// </summary>
        public List<listarCategorias_Result> getCategorias()
        {
            using (var utilizadorDB = new extremeEventsEntities())
            {
                //retorna categorias
                return utilizadorDB.listarCategorias().ToList();
            }
        }

        /// <summary>
        /// Obter as categorias
        /// </summary>
        public List<listarCategorias_Result> listarCategorias()
        {
            using (var utilizadorDb = new extremeEventsEntities())
            {
                //retorna os eventos para listar
                return utilizadorDb.listarCategorias().ToList();
            }
        }

        /// <summary>
        /// Editar a cetegoria
        /// </summary>
        /// <param name="id_categoria"></param>
        /// <param name="nome"></param>
        /// <returns></returns>
        public bool editarCategoria(int id_categoria, string nome) {

            try
            {
                using (var utilizadorDb = new extremeEventsEntities())
                {
                    //editar categoria
                    utilizadorDb.editCategoria(id_categoria, nome);
                    return true;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }

        }

        /// <summary>
        /// Tenta remover uma categoria
        /// </summary>
        /// <param name="id_categoria">O id da categoria</param>
        /// <returns>Retorna TRUE se removido, caso contrario 0</returns>
        public bool removerCategoria(int id_categoria)
        {
            try
            {
                using (var utilizadorDb = new extremeEventsEntities())
                {
                    //remover categoria
                    var rst = utilizadorDb.removerCategoria(id_categoria);

                    //resultado pode ser "bool?"
                    return rst.First() == true;

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
        }

        /// <summary>
        /// Adicionar categoria
        /// </summary>
        /// <param name="id_categoria">O id da categoria</param>
        /// <returns>Retorna TRUE se removido, caso contrario 0</returns>
        public bool addCategoria(string categoria)
        {
            try
            {
                using (var utilizadorDb = new extremeEventsEntities())
                {
                    //adicinar categoria
                    utilizadorDb.addCategoria(categoria);

                    return true;

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
        }

        /// <summary>
        /// Adicionar categoria
        /// </summary>
        /// <param name="id_categoria">O id da categoria</param>
        /// <returns>Retorna TRUE se removido, caso contrario 0</returns>
        public bool setpatrocinio(string nome, byte[] foto)
        {
            try
            {
                using (var utilizadorDb = new extremeEventsEntities())
                {
                    //definie patrocinio
                    utilizadorDb.setPatrocinio(nome, foto);

                    return true;

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
        }

        /// <summary>
        /// Obter patrocinio
        /// </summary>
        public ComplexObject obterPatrocinio()
        {
            using (var utilizadorDb = new extremeEventsEntities())
            {
                //retorna os eventos para listar
                return utilizadorDb.getPatrocinio().ToList().First();
            }
        }


        /// <summary>
        /// Função utilizada para alterar o estado de um evento
        /// </summary>
        /// <param name="id">O id do evento</param>
        /// <param name="estado">O estado a definir (1->Inactivo, 0->Activo)</param>
        /// <returns></returns>
        public bool alterarEstadoEvento(int id, bool cancelado)
        {

            try
            {

                using (var utilizadorDB = new extremeEventsEntities())
                {
                    //alterar o estado na BD
                    var rst = utilizadorDB.alterarEstadoEvento(id, cancelado);

                    return true;
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }

        }
    
    }

}
